package com.hust.ele.request.thread;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import com.hust.ele.request.Request;
import com.hust.ele.request.RequestQueue;

/**
 * @description request线程池
 * @author 周杨
 * @Time 2018年10月24日 下午4:04:18
 */
public class RequestProcessorThreadPool {

    //该方法还并未加入spring容器中
	private ExecutorService threadPool = Executors.newFixedThreadPool(10);// 创建一个线程池 10可以写入配置文件中

	public RequestProcessorThreadPool() {
		RequestQueue requestQueue = RequestQueue.getInstance();

		for (int i = 0; i < 10; i++) {
			ArrayBlockingQueue<Request> queue = new ArrayBlockingQueue<Request>(
					100);// 一个请求队列放100个请求
			requestQueue.addQueue(queue); // 将该队列放入线程池中 有10这这样的队列
			threadPool.submit(new RequestProcessorThread(queue)); // 把线程放入其中
		}
	}
	

	/**
	 * @description 静态内部类的方式，去初始化单例
	 * @author 周杨
	 * @Time 2018年10月24日 下午4:07:35
	 */
	private static class Singleton {

		private static RequestProcessorThreadPool instance;

		static {
			instance = new RequestProcessorThreadPool();
		}

		public static RequestProcessorThreadPool getInstance() {
			return instance;
		}

	}
	/**
	 * @description jvm的机制去保证多线程并发安全
	 * 内部类的初始化，一定只会发生一次，不管多少个线程并发去初始化
	 * @author 周杨
	 * @Time 2018年10月24日 下午4:06:57
	 */
	public static RequestProcessorThreadPool getInstance() {
		return Singleton.getInstance();
	}

	/**
	 * @description 初始化的便捷方法
	 * @author 周杨
	 * @Time 2018年10月24日 下午4:07:16
	 */
	public static void init() {
		getInstance();
	}

}
